<!-- http缓存 -->

为了减少资源请求次数，加快资源访问速度，浏览器对资源文件如图片、css文件、js文件等有一个缓存功能。
而浏览器缓存策略又分为强缓存和协商缓存

强缓存可以理解为强制缓存的意思，浏览器在访问某个资源文件时，会判断是否使用本地缓存里已经存在的资源文件，
使用本地缓存的话则不会发送请求到服务器，从而达到减轻服务器访问压力的作用


强缓存具体流程为：
浏览器第一次请求远程服务器的某个资源时，如果服务器希望浏览器得到该资源文件后一段时间内不要再发送请求过来，
直接从浏览器的缓存里面取，则服务器可以通过在响应头里设置Cache-Control: max-age= xxx, max-age代表缓存时间，
单位为毫秒，意味着在设置的这个时间范围之内浏览器不会再向服务器发送请求，使用缓存的话状态码200后面会标明情况，
比如200(from disk cache)

浏览器缓存资源的地方有两个，磁盘缓存（disk cache）和内存缓存(memory cache)

比较            读取速度                                        时效性            容量     匹配优先级
内存缓存          快速                                      进程关闭,内存清空       小        先
硬盘缓存    速度比内存缓存慢,需要重新解析文件,进行I/O操作             时效长             大        后


当缓存到期后再次访问时，状态码后面便没有括号里面的内容了

强缓存除了可以使用Cache-Control之外，还可以使用Expires字段

Expires是http1.0规范，Cache-Control是http1.1规范，Expires返回一个具体的时间值，代表缓存的有效期
在该日期内浏览器不会向服务器发起请求，而是直接从缓存里获取资源，因为Expires参照的是本地客户端的时间，
而客户端的时间是可以被修改的，所以会有误差产生的情况，这也是Expires的一个缺点，所以有了后来http1.1
规范的Cache-Control
Cache-Control的优先级高于Expires，如果两者同时设置会优先使用Cache-Control而忽略掉Expires


<!-- 在强缓存里，是否使用缓存是由浏览器来确定的，而协商缓存是由服务器来告诉浏览器是否使用缓存资源 -->

浏览器每一次都要发送请求到服务器询问是否使用缓存

协商缓存的具体流程如下：

浏览器初次请求资源，服务器返回资源，同时生成一个Etag值携带在响应头里返回给浏览器，当浏览器再次请求资源时，
会在请求头里携带If-None-Match,值是之前服务器返回的Etag值，服务器收到之后拿该值与资源文件最新的Etag值做对比，
如果没有变化则返回304，告诉浏览器继续使用缓存，不返回资源文件。
如果发生变化，则返回200和最新的资源文件给浏览器使用。


除了Etag外，还有一个Last-Modified属性，它是http1.0规范的，服务器返回Last-Modified,浏览器请求头携带的是IF-Modified-since,
与Etag不同的是，Last-Modified值是一个时间值，代表文件的修改时间，服务器通过对比文件的修改时间是否发生改变来判断是否使用缓存。
相比Last-Modified, Etag优先级更高，使用上也更精确一些，因为有时候会存在文件内容并没有改变，但文件的修改时间变更了，Last-Modified
不一致所以服务器会重新返回资源文件，实际上还是可以继续使用缓存的。

<!-- 总结一下 -->
强缓存就是浏览器本地根据服务器设置的过期时间来判断是否使用缓存，未过期则从本地缓存里拿取资源，已过期则重新请求服务器获取最新资源
强缓存优先级大于协商缓存，即两者同时存在时，如果强缓存开启且在有效期内则不会走协商缓存。
协商缓存则是浏览器本地每次都向服务器发起请求，由服务器来告诉浏览器是从缓存里拿资源还是返回最新资源给浏览器使用。

